take(N)
,今天介紹也是跟數量有關的,不過它比較有個性,只抓一個 ~ first
。☕first
定義如下:first()
: default
值是undefined
,也就是說,我們不輸入任何值也可以,直接取出observable
的第一個值。first(條件式)
:當偵測到observable
的條件式吻合後,隨即結束。import { from, first, fromEvent, map } from 'rxjs';
// 建立觀察者
const observer = {
next: console.log,
complete: () => console.log('completed!'),
};
// case1: first()
console.log('=== case1: first() ===)');
from([1, 2, 3, 4, 5]).pipe(first()).subscribe(observer); //<-- 偵測到第一筆資料,隨即結束
// 印出
// 1
// completed!
HTML
建置一個長寬各100px的點擊區javascript
中,偵測click event
,當click
於x<100
或 y<100
的區域,也就是我們剛剛設置的點擊區,隨即結束任務。HTML
中顯示completed!
stackblitz
-html
<body>
<div style="width: 100px; height: 100px; background-color: skyBlue"></div>
<h2>fromEvent + first(condition)</h2>
<p>Click blue cubic once and then completed</p>
<p id="message" style="color: blue"></p>
</body>
javascript
// case2: fromEvent + first;
console.log('=== case2: fromEvent + first(condition) ===)');
fromEvent(document, 'click')
.pipe(
map((event: MouseEvent) => {
// retrieve clientX/Y
return { x: event.clientX, y: event.clientY };
}),
first(({ x, y }) => x < 100 && y < 100) //<-- 當點擊的x<100且y<100,代表藍色點擊區,隨即結束
)
.subscribe({
next: console.log,
complete: () => {
document.getElementById('message').innerHTML = 'completed!';
console.log('completed!');
},
});
completed
的函示中,進行element
的設定,顯示completed!
於HTML
中。case2
稍微修改一下,讓整個程式更俐落。document.getElementById('click-area')
取得element
element
放置於fromEvent
的第一個參數,即形成專屬click-area藍色區塊的observable
pipe
中依序放入first()
,並用map
拆解出clientX/Y
// case3: fromEvent + first;
console.log('=== case3: fromEvent(element) + first(condition) ===)');
const clickArea = document.getElementById('click-area'); //<--取得element
// console.log(clickArea.id);
fromEvent(clickArea, 'click')
.pipe(
first(), //<--當clickArea被點擊一次,隨即結束
map((event: MouseEvent) => {
return { x: event.clientX, y: event.clientY };
})
)
.subscribe({
next: console.log,
complete: () => {
document.getElementById('message').innerHTML = 'completed!';
console.log('completed!');
},
});
first()
:預設參數為undefined
,如果不提供任何參數,抓取第一筆資料後即結束。first(條件式)
:符合條件式,即抓取第一筆資料後結束。take
與firsr
適合與fromEvent
搭配,可以設計出不同的使用者操作形式。第18天完工,今天說得有點多,很多都是基本功,花點時間釐清一下,鍛鍊一下RxJS
的肌肉,看到沒~目標就在不遠處囉!!